package xyz.heyaoshare.utils;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * AES 工具类
 * @author YueHe
 * @version 0.0.1
 * @since 2025/6/25 上午10:41
 */
public class AESUtil {

    /**
     * 使用AES算法对数据进行加密，并返回Base64编码后的密文。
     *
     * @param data 需要加密的原始数据
     * @param key  用于加密的密钥
     * @return Base64编码后的加密数据
     * @throws Exception 加密过程中可能抛出的异常
     */
    public static String encrypt(String data, String key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    /**
     * 使用AES算法解密字符串
     *
     * @param encryptedData 加密后的字符串
     * @param key           用于解密的密钥
     * @return 解密后的字符串
     * @throws Exception 如果解密过程中出现异常，则抛出该异常
     */
    public static String decrypt(String encryptedData, String key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    /**
     * 生成AES密钥[默认128位]，并返回其Base64编码的字符串表示。
     *
     * @return AES密钥的Base64编码字符串
     * @throws Exception 如果密钥生成过程中发生异常
     */
    public static String generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); // 可以是128, 192或256位
        SecretKey secretKey = keyGen.generateKey();
        return Base64.getEncoder().encodeToString(secretKey.getEncoded());
    }

    /**
     * 生成指定大小的AES密钥，并将其编码为Base64字符串。
     *
     * @param keySize 密钥大小，可以是128、192或256位。如果传入的值不是这三个之一，将默认使用128位。
     * @return 生成的AES密钥的Base64编码字符串。
     * @throws Exception 如果密钥生成失败，将抛出异常。
     */
    public static String generateKey(int keySize) throws Exception {
        if (keySize != 128 && keySize != 192 && keySize != 256) {
            keySize = 128;
        }
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(keySize);
        SecretKey secretKey = keyGen.generateKey();
        return Base64.getEncoder().encodeToString(secretKey.getEncoded());
    }

}